// Package pay_api provides data models for payment API operations.
package pay_api

import (
	"github.com/gogf/gf/v2/encoding/gjson"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/util/gconv"
)

// Common response structures
type CommonRes[T any] struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
	Data    T      `json:"data,omitempty"`
}

type CommonRefundListRes[T any] struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
	List    T      `json:"results,omitempty"`
}

type CommonListRes[T any] struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
	List    T      `json:"list,omitempty"`
}

// Order related models
type CreateOrderParam struct {
	AgentId      string `json:"agent_id"`      // 代理商编号
	MerchantId   string `json:"merchant_id"`   // 商户号
	OrderId      string `json:"order_id"`      // 订单号
	Amount       string `json:"amount"`        // 金额，单位：分
	PayType      string `json:"pay_type"`      // 支付类型
	NotifyUrl    string `json:"notify_url"`    // 通知地址
	JumpUrl      string `json:"jump_url"`      // 跳转地址
	JspayFlag    string `json:"jspay_flag"`    // JSPay标志
	Openid       string `json:"openid"`        // 微信openid
	SubOpenid    string `json:"sub_openid"`    // 子商户openid
	SubAppid     string `json:"sub_appid"`     // 子商户appid
	Attach       string `json:"attach"`        // 附加数据
	GoodsTag     string `json:"goods_tag"`     // 商品标记
	GoodsDetail  string `json:"goods_detail"`  // 商品详情
	TimeStart    string `json:"time_start"`    // 交易起始时间
	TimeExpire   string `json:"time_expire"`   // 交易结束时间
	AuthCode     string `json:"auth_code"`     // 授权码
	StoreInfo    string `json:"store_info"`    // 门店信息
	TerminalInfo string `json:"terminal_info"` // 终端信息
}

type CreateOrderResp struct {
	OrderId     string     `json:"order_id"`     // 订单号
	Amount      string     `json:"amount"`       // 金额
	RealAmount  string     `json:"real_amount"`  // 实际金额
	Status      string     `json:"status"`       // 状态
	PayType     string     `json:"pay_type"`     // 支付类型
	CreateTime  string     `json:"create_time"`  // 创建时间
	PayTime     string     `json:"pay_time"`     // 支付时间
	LeshuaResp  LeshuaResp `json:"leshua_resp"`  // 乐刷响应
	PayUrl      string     `json:"pay_url"`      // 支付链接
	QrCode      string     `json:"qr_code"`      // 二维码
	JsPayParams PayParams  `json:"js_pay_params"` // JS支付参数
}

type LeshuaResp struct {
	ReturnCode string `json:"return_code"` // 返回码
	ReturnMsg  string `json:"return_msg"`  // 返回消息
	ResultCode string `json:"result_code"` // 结果码
	ErrCode    string `json:"err_code"`    // 错误码
	ErrCodeDes string `json:"err_code_des"` // 错误描述
}

type PayParams struct {
	AppId     string `json:"appId"`     // 应用ID
	TimeStamp string `json:"timeStamp"` // 时间戳
	NonceStr  string `json:"nonceStr"`  // 随机字符串
	Package   string `json:"package"`   // 包
	SignType  string `json:"signType"`  // 签名类型
	PaySign   string `json:"paySign"`   // 支付签名
}

type RefundOrderParam struct {
	AgentId    string `json:"agent_id"`    // 代理商编号
	MerchantId string `json:"merchant_id"` // 商户号
	OrderId    string `json:"order_id"`    // 订单号
	RefundId   string `json:"refund_id"`   // 退款单号
	Amount     string `json:"amount"`      // 退款金额，单位：分
	Reason     string `json:"reason"`      // 退款原因
	NotifyUrl  string `json:"notify_url"`  // 通知地址
}

type RefundOrderRequest struct {
	RefundOrderParams []RefundOrderParam `json:"refundOrderParams"`
}

type RefundOrderRes struct {
	OrderId    string `json:"order_id"`    // 订单号
	RefundId   string `json:"refund_id"`   // 退款单号
	Amount     string `json:"amount"`      // 退款金额
	Status     string `json:"status"`      // 状态
	CreateTime string `json:"create_time"` // 创建时间
	RefundTime string `json:"refund_time"` // 退款时间
}

type QueryOrderInput struct {
	AgentId    string `json:"agent_id"`    // 代理商编号
	MerchantId string `json:"merchant_id"` // 商户号
	OrderId    string `json:"order_id"`    // 订单号
}

type OrderInfo struct {
	OrderId     string `json:"order_id"`     // 订单号
	Amount      string `json:"amount"`       // 金额
	RealAmount  string `json:"real_amount"`  // 实际金额
	Status      string `json:"status"`       // 状态
	PayType     string `json:"pay_type"`     // 支付类型
	CreateTime  string `json:"create_time"`  // 创建时间
	PayTime     string `json:"pay_time"`     // 支付时间
	NotifyUrl   string `json:"notify_url"`   // 通知地址
	JumpUrl     string `json:"jump_url"`     // 跳转地址
	Attach      string `json:"attach"`       // 附加数据
	GoodsTag    string `json:"goods_tag"`    // 商品标记
	GoodsDetail string `json:"goods_detail"` // 商品详情
}

// Agent related models
type AgentInfo struct {
	Id                int    `json:"id"`                // 代理商ID
	AgentId           string `json:"agentId"`           // 代理商编号
	Name              string `json:"name"`              // 代理商名称
	Contact           string `json:"contact"`           // 联系人
	Phone             string `json:"phone"`             // 联系电话
	Email             string `json:"email"`             // 邮箱
	Address           string `json:"address"`           // 地址
	Status            int    `json:"status"`            // 状态
	CreateTime        string `json:"createTime"`        // 创建时间
	UpdateTime        string `json:"updateTime"`        // 更新时间
	Remark            string `json:"remark"`            // 备注
	ParentAgentId     string `json:"parentAgentId"`     // 父代理商ID
	Level             int    `json:"level"`             // 代理商级别
	CommissionRate    string `json:"commissionRate"`    // 佣金比例
	SettlementCycle   int    `json:"settlementCycle"`   // 结算周期
	MinSettleAmount   string `json:"minSettleAmount"`   // 最小结算金额
	MaxDailyAmount    string `json:"maxDailyAmount"`    // 日交易限额
	MaxMonthlyAmount  string `json:"maxMonthlyAmount"`  // 月交易限额
	AllowedPayTypes   string `json:"allowedPayTypes"`   // 允许的支付类型
	NotifyUrl         string `json:"notifyUrl"`         // 通知地址
	WhitelistIps      string `json:"whitelistIps"`      // IP白名单
	ApiKey            string `json:"apiKey"`            // API密钥
	SecretKey         string `json:"secretKey"`         // 密钥
	CertPath          string `json:"certPath"`          // 证书路径
	PrivateKeyPath    string `json:"privateKeyPath"`    // 私钥路径
	IsTestMode        bool   `json:"isTestMode"`        // 是否测试模式
	AutoSettle        bool   `json:"autoSettle"`        // 是否自动结算
	RiskControlLevel  int    `json:"riskControlLevel"`  // 风控级别
	BusinessLicense   string `json:"businessLicense"`   // 营业执照
	LegalPerson       string `json:"legalPerson"`       // 法人
	BankAccount       string `json:"bankAccount"`       // 银行账户
	BankName          string `json:"bankName"`          // 银行名称
	AccountHolder     string `json:"accountHolder"`     // 账户持有人
}

// PayChannel related models
type PayChannelInfo struct {
	Id                       int         `json:"id"`                       // 支付渠道ID
	AgentId                  int         `json:"agentId"`                  // 代理商ID
	Type                     int         `json:"type"`                     // 支付渠道类型
	Name                     string      `json:"name"`                     // 名称
	Config                   *gjson.Json `json:"config"`                   // 配置 json，如果非管理员权限，敏感数据将处理后返回
	SslCert                  string      `json:"sslCert"`                  // ssl 证书
	SslKey                   string      `json:"sslKey"`                   // ssl key
	PayNotifyUrl             string      `json:"payNotifyUrl"`             // 支付通知地址
	ServiceProviderChannelId int         `json:"serviceProviderChannelId"` // 服务商模式的channel id
	WithdrawReserveAmount    int         `json:"withdrawReserveAmount"`    // 提现保留金额，单位：分
	AutoWithdraw             bool        `json:"autoWithdraw"`             // 是否开启自动提现
	RefundNotifyUrl          string      `json:"refundNotifyUrl"`          // 支付通知地址
}

func (p *PayChannelInfo) Map() g.Map {
	return g.Map{
		"id":                       p.Id,
		"agentId":                  p.AgentId,
		"type":                     p.Type,
		"name":                     p.Name,
		"config":                   gconv.String(p.Config),
		"payNotifyUrl":             p.PayNotifyUrl,
		"serviceProviderChannelId": p.ServiceProviderChannelId,
		"withdrawReserveAmount":    p.WithdrawReserveAmount,
		"autoWithdraw":             p.AutoWithdraw,
		"refundNotifyUrl":          p.RefundNotifyUrl,
	}
}

type PayChannelConfig struct {
	AgentId      string `json:"agentId"`      // 乐刷代理商编号
	MerchantId   string `json:"merchantId"`   // 乐刷商户号
	Key          string `json:"key"`          // 乐刷key，固定写法
	Appid        string `json:"appid"`        // 小程序 appid
	WithDrawType int    `json:"withDrawType"` // 乐刷提现类型，1-自动提现；2-手动提现（由支付系统接管），不传默认2
	PayRemark    string `json:"payRemark"`    // 打款备注
}

// Request/Response wrapper types
type PayChannelAdminCreateInput struct {
	Secret
	PayChannelInfo PayChannelInfo
}

type PayChannelAdminUpdateInput struct {
	Secret
	PayChannelInfo PayChannelInfo
}

type PayChannelAdminDGInput struct {
	Secret
	AgentId int `json:"agentId"`
	Type    int `json:"type"`
}

type PayChannelAdminResponse struct {
	*CommonRes[interface{}]
	PayChannelInfo *PayChannelInfo `json:"payChannelInfo"`
}

type AgentAdminCreateInput struct {
	Secret
	AgentInfo AgentInfo
}

type AgentAdminUpdateInput struct {
	Secret
	AgentInfo AgentInfo
}

type AgentAdminGetInput struct {
	Secret
	AgentId string `json:"agentId"`
}

type AgentAdminResponse struct {
	*CommonRes[interface{}]
	AgentInfo *AgentInfo `json:"agentInfo"`
}

// Secret holds authentication information
type Secret struct {
	Baseurl  string `json:"baseurl"`
	Username string `json:"username"`
	Key      string `json:"key"`
}